﻿//https://leetcode.cn/problems/set-matrix-zeroes/?envType=study-plan-v2&envId=top-100-liked

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix)
    {
        int n = matrix.size(), m = matrix[0].size();

        //使用一个变量标记第一列是否出现0
        int flag = false;
        for (int i = 0; i < n; i++)
        {
            if (matrix[i][0] == 0)
                flag = true;

            //遍历剩余的数组  标记出现0的位置
            for (int j = 1; j < m; j++)
            {
                if (matrix[i][j] == 0)
                    matrix[i][0] = matrix[0][j] = 0;
            }
        }

        //倒序遍历数组 出现0的行和列都置为0
        //因为之后的其他行的任意位置是否置0要受第一行的影响 所以要从最后一行开始更新
        for (int i = n - 1; i >= 0; i--)
        {
            for (int j = 1; j < m; j++)
            {
                if (matrix[i][0] == 0 || matrix[0][j] == 0)
                {
                    matrix[i][j] = 0;
                }
            }
        }

        if (flag)
        {
            for (int i = 0; i < n; i++)
            {
                matrix[i][0] = 0;
            }
        }

        // //用两个变量标记第一行和第一列是否出现0
        // int flag_col=false,flag_row=false;

        // //遍历第一行看是否存在0
        // for(int j=0;j<m;j++)
        // {
        //     if(matrix[0][j]==0)
        //     flag_row=true;
        // }

        // //遍历第一列看是否存在0
        // for(int i=0;i<n;i++)
        // {
        //     if(matrix[i][0]==0)
        //     flag_col=true;
        // }

        // //遍历剩余数组 用第一行和第一列标记出现0的位置
        // for(int i=1;i<n;i++)
        // {
        //     for(int j=1;j<m;j++)
        //     {
        //         if(matrix[i][j]==0)
        //         {
        //             matrix[i][0]=matrix[0][j]=0;
        //         }
        //     }
        // }

        // //第二次遍历数组 把标记过的第一行和第一列覆盖的整行和整列都置为0
        // for(int i=1;i<n;i++)
        // {
        //     for(int j=1;j<m;j++)
        //     {
        //         if(!matrix[i][0]||!matrix[0][j])
        //         matrix[i][j]=0;
        //     }
        // }

        // //判断第一行第一列本身是否具有0
        // if(flag_col)
        // {
        //     for(int i=0;i<n;i++)
        //     {
        //         matrix[i][0]=0;
        //     }
        // }

        // if(flag_row)
        // {
        //     for(int j=0;j<m;j++)
        //     {
        //         matrix[0][j]=0;
        //     }
        // }


    }
};